<?php
	require_once(dirname(__FILE__)."/incluir.php");
	// #########################################################
	// # Classe que serve para construir e manipular entidades #
	// #########################################################
	class Factory
	{
		// Informações de formulário
		private $get;
		private $post;
		private $id;
	
		public function __construct($post = null, $get = null, $id = null)
		{
			$this->post = $post;
			$this->get = $get;
			$this->id = $id;
		}
	
		// Cria e retorna instancias, usando os nomes das classes passadas (ou da classe passada)
		public function cria_instancia($classes, $post = null, $get = null, $id = null)
		{
			// Tenta pegar esses valores dos parametros passados
			$this->post = isset($post) ? $post : $this->post;
			$this->get = isset($get) ? $get : $this->get;
			$this->id = isset($id) ? $id : $this->id;
			
			if(is_array($classes))
			{
				$instancias = array();
				foreach($classes as $classe)
				{
					array_push($instancias, new $classe($this->post, $this->get, $this->id));
				}
				return $instancias;
			}
			// Se classes na verdade for apenas uma classe, retorna a instancia dessa classe
			return new $classes($this->post, $this->get, $this->id); 
		}
		
		public function cria_instancia_model($tabelas, $id = null)
		{
			$this->id = isset($id) ? $id : $this->id;
			if(is_array($tabelas))
			{
				$instancias = array();
				foreach($tabelas as $tabela)
				{
					$classe = ucfirst($tabela)."Model";
					array_push($instancias, new $classe($this->id));
				}
				return $instancias;
			}
			// Se tabelas na verdade for apenas uma tabela, retorna a instancia do Model associado
			$classe = ucfirst($tabelas)."Model";
			return new $classe($this->id);
		}
	
		// Você passa um array de classes ou só uma e um array de ações (uma por classe), e essa função executa.
		// Se $classes não for um array, mas $actions for, é considerado que é para executar as ações da mesma classe
		// O valor de retorno é a instancia da ultima classe passada ou false indicando que as ações falharam 
		public function action($classes, $actions)
		{
			$instancia = null; // Valerá a ultima instancia que fez a ultima ação valida
			$sucesso = true; // Guarda se as ações foram efetuadas ou não com sucesso
			if(is_array($classes))
			{
				foreach($classes as $index => $classe)
				{
					$instancia = $this->cria_instancia($classe);
					$action = $actions[$index];
						
					if(!($sucesso = $instancia->$action())) // Executa uma ação, para cada par de classe e ação passado
					{
						break;
					}
				}
			}
			else
			{
				$instancia = $this->cria_instancia($classes); // Considera $classes uma string contendo o nome de apenas uma classe
				if(is_array($actions))
				{
					foreach($actions as $action)
					{
						if(!($sucesso = $instancia->$action())) // Executa uma ação, para cada ação presente em $actions
						{
							break;
						}
					}
				}
				else
				{
					$sucesso = $instancia->$actions(); // Executa como se classes e actions não fossem um array
				}
			}
			return array($instancia, $sucesso); // Retorna a instancia que usou para fazer as ações ou false se alguma ação falhou
		}
	
	}
?>